print("冒泡排序"
      "每次循环，将相邻的元素比较，如果不同则交换位置")
def maopao(nums:list[int]) ->list[int]:
    for i in range(0,len(nums)):
        for j in range(0,len(nums)-1-i):
            if nums[j]>nums[j+1]:
                nums[j],nums[j+1]=nums[j+1],nums[j]
    print(nums)
    return nums

print("插入排序"
      "每次遍历，将本元素和之前的进行比较，如果比之前的元素小，则往前插入")
def charupaixu(nums:list[int])->list[int]:
    for i in range(1,len(nums)):
        current_index=i
        while nums[current_index]<nums[current_index-1] and current_index>0:
            nums[current_index],nums[current_index-1]=nums[current_index-1],nums[current_index]
            current_index=current_index-1
    print(nums)
    return nums

print("选择排序"
      "双指针：当前指针和最小值指针初始指向同一个元素，然后最小指针依次向后遍历，更新最小指针"
      "找到最小指针后，将值放到当前指针指向的位置，再次循环，当前指针和最小指针指向下一个相同元素")

def xuanzepaixu(nums:list[int])->list[int]:
    current=0
    while current<len(nums):
        # 最小指针和当前指针指向同一值
        min_index=current
        for i in range(current,len(nums)):
            if nums[i]<nums[min_index]:
                # nums[i],nums[current]=nums[current],nums[i]#此处是直接将最小值和当前索引指向的值进行了替换
                # 只替换索引，找到最小索引
                min_index=i
        # 再根据最小索引，更换当前指针指向的值和最小值
        nums[current],nums[min_index]=nums[min_index],nums[current]
        # 更换当前指针
        current=current+1
    print(nums)
    return nums

def xuanzepaixu2(nums: list[int]) -> list[int]:
    current = 0
    while current < len(nums):  # 注意这里是 < 而不是 <=
        # 最小指针初始化为当前指针
        min_index = current
        for i in range(current, len(nums)):
            if nums[i] < nums[min_index]:
                # 更新最小值的索引
                min_index = i
        # 交换当前索引位置的元素和找到的最小值
        nums[current], nums[min_index] = nums[min_index], nums[current]
        # 移动到下一个未排序的元素
        current += 1
    print(nums)
    return nums
if __name__ == '__main__':
    source_list = [1, 2, 4, 5, 7, 23, 3, 1, 2, 5, 3]
    # maopao(nums=source_list)
    # charupaixu(nums=source_list)
    xuanzepaixu(nums=source_list)
    # xuanzepaixu2(nums=source_list)